home *** CD-ROM | disk | FTP | other *** search
/ Software 2000 / Software 2000 Volume 1 (Disc 1 of 2).iso / utilities / u303.dms / in.adf / Keyboard_Definer.AMOS / Keyboard_Definer.amosSourceCode < prev    next >
Encoding:
AMOS Source Code  |  1990-11-07  |  15.7 KB  |  607 lines

  1. '   AMOS Keyboard Definer V.1! 
  2. '
  3. '       By P.J.Hickman 
  4. '
  5. '� Copyright 1990 Mandarin Software  
  6. '
  7. 'Set up variables  
  8. KEY_BUFFER=Areg(4)
  9. WEIGHTING=0
  10. HIGHLIGHTED_KEY=-1
  11. Dim WHERE(95,3)
  12. SEL_ASCII=0
  13. FILE$=""
  14. Close Editor 
  15. 'Global variables for alert box  
  16. Dim LINE$(5),BUTTON$(3)
  17. 'Get the fonts 
  18. Get Rom Fonts 
  19. Set Font 1
  20. 'Copy the keyboard layout into a memory bank, just in case the user  
  21. 'wishes to get the original key board back.
  22. Reserve As Work 6,388
  23. Copy KEY_BUFFER,KEY_BUFFER+388 To Start(6)
  24. 'Set up the initial display  
  25. SET_UP_SCREEN
  26. SET_UP_ZONES
  27. KEYBOARD_PRINT
  28. DISPLAY_CHAR_VALUE
  29. On Menu Proc MENU_1,MENU_2
  30. Repeat 
  31.    Repeat 
  32.       On Menu On 
  33.       M=Mouse Zone
  34.       C=(Mouse Key=1)
  35.    Until C
  36.    'If the user clicks on the ascii display window, poke it!! 
  37.    If M=15 and HIGHLIGHTED_KEY<>-1
  38.       Bell 
  39.       Poke KEY_BUFFER+HIGHLIGHTED_KEY+(96*WEIGHTING),SEL_ASCII
  40.       KEY_STICK[HIGHLIGHTED_KEY,1]
  41.       DISPLAY_KEY_INFO[HIGHLIGHTED_KEY]
  42.       Wait 5
  43.    End If 
  44.    'This bit controls the ALT part of the keyboard  
  45.    If M=72 or M=73
  46.       If WEIGHTING=2
  47.          ALT[0]
  48.          WEIGHTING=0
  49.       Else 
  50.          If WEIGHTING=3
  51.             ALT[0]
  52.             WEIGHTING=1
  53.          Else 
  54.             If WEIGHTING=0
  55.                WEIGHTING=2
  56.                ALT[1]
  57.             Else 
  58.                WEIGHTING=3
  59.                ALT[1]
  60.             End If 
  61.          End If 
  62.       End If 
  63.       KEYBOARD_PRINT
  64.       If HIGHLIGHTED_KEY<>-1
  65.          KEY_STICK[HIGHLIGHTED_KEY,1]
  66.          DISPLAY_KEY_INFO[HIGHLIGHTED_KEY]
  67.       End If 
  68.    End If 
  69.    'This bit controls the SHIFT/CAPS part of the keyboard 
  70.    If M=69 or M=70 or M=66
  71.       If WEIGHTING=1
  72.          SHIFTS[0]
  73.          WEIGHTING=0
  74.       Else 
  75.          If WEIGHTING=3
  76.             SHIFTS[0]
  77.             WEIGHTING=2
  78.          Else 
  79.             Inc WEIGHTING
  80.             SHIFTS[1]
  81.          End If 
  82.       End If 
  83.       KEYBOARD_PRINT
  84.       If HIGHLIGHTED_KEY<>-1
  85.          KEY_STICK[HIGHLIGHTED_KEY,1]
  86.          DISPLAY_KEY_INFO[HIGHLIGHTED_KEY]
  87.       End If 
  88.    End If 
  89.    'This bits do the rest of the keyboard (selectable keys) 
  90.    If M<>0 and M<>66 and M<>69 and M<>70 and M<>72 and M<>73 and M<>74 and M<>76 and M<>15 and M<>29 and C and M-1<>HIGHLIGHTED_KEY and M<97
  91.       If HIGHLIGHTED_KEY<>-1
  92.          KEY_STICK[HIGHLIGHTED_KEY,0]
  93.       End If 
  94.       KEY_STICK[M-1,1]
  95.       DISPLAY_KEY_INFO[M-1]
  96.       HIGHLIGHTED_KEY=M-1
  97.    End If 
  98.    'These lines check the ASCII code selecter arrows  
  99.    If M=74
  100.       Add SEL_ASCII,-1,0 To 255
  101.       DISPLAY_CHAR_VALUE
  102.       Wait 5
  103.    End If 
  104.    If M=76
  105.       Add SEL_ASCII,1,0 To 255
  106.       DISPLAY_CHAR_VALUE
  107.       Wait 5
  108.    End If 
  109.    'Has the input zone been clicked on? 
  110.    If M=29
  111.       TEST_KEYBOARD
  112.    End If 
  113.    Clear Key 
  114. Until False
  115. 'The next two procedures activate menu options when selected.  
  116. Procedure MENU_1
  117.    Shared LINE$(),BUTTON$()
  118.    If Choice(2)=1
  119.       For LOP=1 To 10
  120.          Bell 50+LOP
  121.          Wait 3
  122.       Next LOP
  123.       LINE$(0)="Keyboard Definer"
  124.       LINE$(1)="~~~~~~~~~~~~~~~~"
  125.       LINE$(2)=""
  126.       LINE$(3)=" By P.J.Hickman"
  127.       BUTTON$(0)="Have Fun!!!"
  128.       ALERT[22,9,7,1,1,4]
  129.    End If 
  130.    If Choice(2)=3
  131.       Default 
  132.       End 
  133.    End If 
  134.    On Menu On 
  135. End Proc
  136. Procedure MENU_2
  137.    Shared HIGHLIGHTED_KEY
  138.    If Choice(2)=1 Then KEYBOARD_LOAD
  139.    If Choice(2)=2 Then KEYBOARD_SAVE[1]
  140.    If Choice(2)=3 Then KEYBOARD_SAVE[2]
  141.    If Choice(2)=8 Then TEST_KEYBOARD
  142.    If Choice(2)=5 and HIGHLIGHTED_KEY<>-1 Then KEY_RESTORE
  143.    If Choice(2)=6 Then KEYBOARD_RESTORE
  144.    On Menu On 
  145. End Proc
  146. 'The next two procedures restore the key (or keyboard) to it's original  
  147. 'state.  
  148. Procedure KEY_RESTORE
  149.    Shared WEIGHTING,KEY_BUFFER,HIGHLIGHTED_KEY
  150.    Bell 30
  151.    Poke KEY_BUFFER+HIGHLIGHTED_KEY+(96*WEIGHTING),Peek(Start(6)+HIGHLIGHTED_KEY+(96*WEIGHTING))
  152.    KEY_STICK[HIGHLIGHTED_KEY,1]
  153.    DISPLAY_KEY_INFO[HIGHLIGHTED_KEY]
  154. End Proc
  155. Procedure KEYBOARD_RESTORE
  156.    Shared KEY_BUFFER,LINE$(),BUTTON$(),HIGHLIGHTED_KEY
  157.    LINE$(0)="Are you sure you want to restore the"
  158.    LINE$(1)="keyboard to it's default setting?"
  159.    BUTTON$(0)="Yes please"
  160.    BUTTON$(1)="No thanks!"
  161.    ALERT[40,7,7,1,2,2]
  162.    If Param=1
  163.       Bell 30
  164.       Copy Start(6),Start(6)+388 To KEY_BUFFER
  165.       KEYBOARD_PRINT
  166.       If HIGHLIGHTED_KEY<>-1
  167.          KEY_STICK[HIGHLIGHTED_KEY,1]
  168.       End If 
  169.    End If 
  170. End Proc
  171. 'The next two procedures highlight (and lowlight?) the SHIFT & ALT keys. 
  172. Procedure SHIFTS[TYPE]
  173.    If TYPE=0
  174.       Ink 6
  175.    Else 
  176.       Ink 3
  177.    End If 
  178.    ' ----- two shift keys ----- 
  179.    Bar X Screen(1,134),Y Screen(1,199) To X Screen(1,152),Y Screen(1,209)
  180.    Bar X Screen(1,305),Y Screen(1,199) To X Screen(1,337),Y Screen(1,209)
  181.    ' ----- caps lock -----
  182.    Bar X Screen(1,150),Y Screen(1,185) To X Screen(1,159),Y Screen(1,195)
  183. End Proc
  184. Procedure ALT[TYPE]
  185.    If TYPE=0
  186.       Ink 6
  187.    Else 
  188.       Ink 3
  189.    End If 
  190.    Bar X Screen(1,143),Y Screen(1,213) To X Screen(1,155),Y Screen(1,223)
  191.    Bar X Screen(1,314),Y Screen(1,213) To X Screen(1,326),Y Screen(1,223)
  192. End Proc
  193. 'Procedure to save the keyboard layout stored in memory  
  194. Procedure KEYBOARD_SAVE[TYPE]
  195.    Shared FILE$,KEY_BUFFER,LINE$(),BUTTON$()
  196.    On Error Goto FATEL_ERROR1
  197.    If(TYPE=1 and Asc(FILE$)=0) or TYPE=2
  198.       FILE$=Fsel$("*.Key","","Please choose a save name")
  199.    End If 
  200.    Bsave FILE$,KEY_BUFFER To KEY_BUFFER+388
  201.    RECOVER_1:
  202.    Pop Proc
  203.    FATEL_ERROR1:
  204.    If FILE$<>""
  205.       For LOP=1 To 5
  206.          Bell 30-LOP
  207.          Wait 3
  208.       Next LOP
  209.       LINE$(0)="Woops, disc error!"
  210.       BUTTON$(0)="Never mind."
  211.       ALERT[21,7,7,1,1,1]
  212.    End If 
  213.    Resume RECOVER_1
  214. End Proc
  215. 'Procedure to load a Keyboard layout in from disc  
  216. Procedure KEYBOARD_LOAD
  217.    Shared FILE$,KEY_BUFFER,LINE$(),BUTTON$()
  218.    On Error Goto FATEL_ERROR2
  219.    FILE$=Fsel$("*.Key","","Please choose a keyboard to load")
  220.    If Not Exist(FILE$)
  221.       For LOP=1 To 5
  222.          Bell 30-LOP
  223.          Wait 3
  224.       Next LOP
  225.       LINE$(0)="I cannot find that"
  226.       LINE$(1)="file on this disc!"
  227.       BUTTON$(0)="Woops........"
  228.       ALERT[21,7,7,1,1,2]
  229.       FILE$=""
  230.    Else 
  231.       Open In 1,FILE$
  232.       L=Lof(1)
  233.       Close 
  234.       If L<>388
  235.          For LOP=1 To 5
  236.             Bell 30-LOP
  237.             Wait 3
  238.          Next LOP
  239.          LINE$(0)="Hey,  this is not"
  240.          LINE$(1)="an AMOS keytable!"
  241.          BUTTON$(0)="Sorry......"
  242.          ALERT[23,7,7,1,1,2]
  243.          FILE$=""
  244.       Else 
  245.          Bload FILE$,KEY_BUFFER
  246.          KEYBOARD_PRINT
  247.       End If 
  248.    End If 
  249.    RECOVER_2:
  250.    Close 
  251.    Pop Proc
  252.    FATEL_ERROR2:
  253.    If FILE$<>""
  254.       For LOP=1 To 5
  255.          Bell 30-LOP
  256.          Wait 3
  257.       Next LOP
  258.       LINE$(0)="Woops, disc error!"
  259.       BUTTON$(0)="Never mind."
  260.       ALERT[21,7,7,1,1,1]
  261.       FILE$=""
  262.    End If 
  263.    Resume RECOVER_2
  264. End Proc
  265. 'This procedure unpacks a hires screen containing the keyboard picture.  
  266. 'It also sets up the menu, selected by clicking on the right button!!! 
  267. Procedure SET_UP_SCREEN
  268.    Unpack 5 To 1
  269.    Autoback 0
  270.    Paper 0
  271.    Pen 0
  272.    Curs Off 
  273.    Print At(0,0);" ";
  274.    Paper 6
  275.    Ink 3
  276.    Menu$(1)=" AMOS  "
  277.    Menu$(1,1)=" About "
  278.    Menu$(1,2)="=======" : Menu Inactive(1,2)
  279.    Menu$(1,3)=" Quit  "
  280.    Menu$(2)=" Edit "
  281.    Menu$(2,1)=" Load Keymap      "
  282.    Menu$(2,2)=" Save Keymap      "
  283.    Menu$(2,3)=" Save As....      "
  284.    Menu$(2,4)="==================" : Menu Inactive(2,4)
  285.    Menu$(2,5)=" Restore Key      "
  286.    Menu$(2,6)=" Restore Keyboard "
  287.    Menu$(2,7)="==================" : Menu Inactive(2,7)
  288.    Menu$(2,8)=" Try Keyboard     "
  289.    Menu On 
  290.    Set Font 1
  291. End Proc
  292. 'This procedure sets up a zone for nearly EVERY key on the keyboard. 
  293. 'All of the co-ordinates in the data statements are in HARDWARE format.  
  294. Procedure SET_UP_ZONES
  295.    Shared WHERE()
  296.    Reserve Zone(100)
  297.    Restore AREA_DATA
  298.    For LOP=1 To 96
  299.       Read XS,YS,XE,YE
  300.       Set Zone LOP,X Screen(1,XS),Y Screen(1,YS) To X Screen(1,XE),Y Screen(1,YE)
  301.       WHERE(LOP-1,0)=X Screen(1,XS)
  302.       WHERE(LOP-1,1)=Y Screen(1,YS)
  303.       WHERE(LOP-1,2)=X Screen(1,XE)
  304.       WHERE(LOP-1,3)=Y Screen(1,YE)
  305.    Next LOP
  306.    AREA_DATA:
  307.    Data 133,156,149,168
  308.    ' ----- 1234567890-=| ------ 
  309.    Data 151,156,162,168
  310.    Data 164,156,176,168
  311.    Data 178,156,189,168
  312.    Data 191,156,203,168
  313.    Data 205,156,216,168
  314.    Data 218,156,230,168
  315.    Data 232,156,243,168
  316.    Data 245,156,257,168
  317.    Data 259,156,270,168
  318.    Data 272,156,284,168
  319.    Data 286,156,297,168
  320.    Data 299,156,311,168
  321.    Data 313,156,324,168
  322.    ' ----- ascii char display ----- 
  323.    Data 288,100,360,114
  324.    ' ----- keypad 0 ----- 
  325.    Data 391,212,416,224
  326.    ' ----- qwertyuiop[] ----- 
  327.    Data 157,170,168,182
  328.    Data 170,170,182,182
  329.    Data 184,170,195,182
  330.    Data 197,170,209,182
  331.    Data 211,170,222,182
  332.    Data 224,170,236,182
  333.    Data 238,170,249,182
  334.    Data 251,170,263,182
  335.    Data 265,170,276,182
  336.    Data 278,170,290,182
  337.    Data 292,170,303,182
  338.    Data 305,170,317,182
  339.    ' ----- input window ----- 
  340.    Data 129,78,447,92
  341.    ' ----- keypad 123 ----- 
  342.    Data 391,198,403,210
  343.    Data 405,198,416,210
  344.    Data 418,198,430,210
  345.    ' ----- asdfghjkl;# -----
  346.    Data 163,184,174,196
  347.    Data 176,184,188,196
  348.    Data 190,184,201,196
  349.    Data 203,184,215,196
  350.    Data 217,184,228,196
  351.    Data 230,184,242,196
  352.    Data 244,184,255,196
  353.    Data 257,184,269,196
  354.    Data 271,184,282,196
  355.    Data 284,184,296,196
  356.    Data 298,184,309,196
  357.    ' ----- non-English extra key #1 ----- 
  358.    Data 311,184,323,196
  359.    ' ----- blank #1 ----- 
  360.    Data 0,0,1,1
  361.    ' ----- keypad 456 ------
  362.    Data 391,184,403,196
  363.    Data 405,184,416,196
  364.    Data 418,184,430,196
  365.    ' ----- non-English extra key #2 ----- 
  366.    Data 155,198,167,210
  367.    ' ----- zxcvbnm,./ ----- 
  368.    Data 169,198,180,210
  369.    Data 182,198,194,210
  370.    Data 196,198,207,210
  371.    Data 209,198,221,210
  372.    Data 223,198,234,210
  373.    Data 236,198,248,210
  374.    Data 250,198,261,210
  375.    Data 263,198,275,210
  376.    Data 277,198,288,210
  377.    Data 290,198,302,210
  378.    ' ----- blank #2 ----- 
  379.    Data 0,0,1,1
  380.    ' ----- keypad .789 -----
  381.    Data 418,212,430,224
  382.    Data 391,170,403,182
  383.    Data 405,170,416,182
  384.    Data 418,170,430,182
  385.    ' ----- space bar -----
  386.    Data 175,212,294,224
  387.    ' ----- caps lock -----
  388.    Data 149,184,160,196
  389.    ' ----- tab key -----
  390.    Data 133,170,155,182
  391.    ' ----- keypad enter ----- 
  392.    Data 431,198,443,224
  393.    ' ----- left, right shift -----
  394.    Data 133,198,153,210
  395.    Data 304,198,338,210
  396.    ' ----- del key -----
  397.    Data 345,156,364,168
  398.    ' ----- left,right alt ----- 
  399.    Data 142,212,156,224
  400.    Data 313,212,327,224
  401.    ' ----- dec ascii arrow -----
  402.    Data 206,101,213,113
  403.    ' ----- keypad - ----- 
  404.    Data 432,170,443,182
  405.    ' ----- inc ascii arrow -----
  406.    Data 362,101,369,113
  407.    ' ----- up,down,right,left cursor keys ----- 
  408.    Data 359,184,370,196
  409.    Data 359,198,370,210
  410.    Data 372,198,384,210
  411.    Data 345,198,357,210
  412.    ' ----- function keys 1-10 ----- 
  413.    Data 151,137,166,149
  414.    Data 168,137,183,149
  415.    Data 185,137,200,149
  416.    Data 202,137,217,149
  417.    Data 219,137,234,149
  418.    Data 241,137,256,149
  419.    Data 258,137,273,149
  420.    Data 275,137,290,149
  421.    Data 292,137,307,149
  422.    Data 309,137,324,149
  423.    ' ----- keypad ()/*+ ----- 
  424.    Data 391,156,403,168
  425.    Data 405,156,416,168
  426.    Data 418,156,430,168
  427.    Data 432,156,443,168
  428.    Data 432,184,443,196
  429.    ' ----- help key ----- 
  430.    Data 365,156,384,168
  431. End Proc
  432. 'This procedure prints out all of the letters on the keyboard. 
  433. Procedure KEYBOARD_PRINT
  434.    Shared WHERE(),KEY_BUFFER,WEIGHTING
  435.    Ink 0
  436.    Paper 6
  437.    Set Text 2
  438.    For LOP=0 To 95
  439.       If WHERE(LOP,0)<>0 and LOP<>65 and LOP<>68 and LOP<>69 and LOP<>71 and LOP<>72 and LOP<>73 and LOP<>75 and LOP<>14 and LOP<>28
  440.          KEY_STICK[LOP,0]
  441.       End If 
  442.    Next LOP
  443. End Proc
  444. 'This procedure just sticks a single letter on the keyboard. 
  445. Procedure KEY_STICK[NUM,TYPE]
  446.    Shared WHERE(),KEY_BUFFER,WEIGHTING,XS,XE,YS,YE
  447.    If TYPE=0
  448.       Ink 6
  449.    Else 
  450.       Ink 3
  451.    End If 
  452.    Gr Writing 0
  453.    XS=WHERE(NUM,0)
  454.    YS=WHERE(NUM,1)
  455.    XE=WHERE(NUM,2)
  456.    YE=WHERE(NUM,3)
  457.    If XS>0 and YS>0
  458.       Bar XS+2,YS+1 To XE-2,YE-1
  459.       X=((XE-XS)/2)+XS-4
  460.       Ink 0
  461.       TEMP=Peek(KEY_BUFFER+NUM+(96*WEIGHTING))
  462.       Text X-1,YE-3,Chr$(TEMP)
  463.    End If 
  464. End Proc
  465. 'This procedure displays the info about the current ASCII character  
  466. 'selected.   
  467. Procedure DISPLAY_CHAR_VALUE
  468.    Shared SEL_ASCII
  469.    Ink 6
  470.    Bar X Screen(1,217),Y Screen(1,101) To X Screen(1,285),Y Screen(1,113)
  471.    Bar X Screen(1,289),Y Screen(1,101) To X Screen(1,358),Y Screen(1,113)
  472.    Ink 0
  473.    Gr Writing 0
  474.    TEMP1$="ASCII:"+Str$(SEL_ASCII)
  475.    TEMP2$="CHARACTER: "+Chr$(SEL_ASCII)
  476.    X1=(68-Text Length(TEMP1$))/2
  477.    X2=(68-Text Length(TEMP2$))/2
  478.    Text 178+X1,60,TEMP1$
  479.    Text 322+X2,60,TEMP2$
  480. End Proc
  481. 'This procedure displays information about the current highlighted key.
  482. Procedure DISPLAY_KEY_INFO[CHAR]
  483.    Shared KEY_BUFFER,WEIGHTING
  484.    TEMP=Peek(KEY_BUFFER+CHAR+(96*WEIGHTING))
  485.    TEMP2=Peek(Start(6)+CHAR+(96*WEIGHTING))
  486.    Ink 6
  487.    Bar 2,29 To 637,41
  488.    Ink 0
  489.    Gr Writing 0
  490.    TEMP1$="KEY SCANCODE:"+Str$(CHAR)+"     "
  491.    TEMP2$="DEFAULT VALUE:"+Str$(TEMP2)+"     "
  492.    TEMP3$="CURRENT VALUE:"+Str$(TEMP)
  493.    X=636-Text Length(TEMP1$+TEMP2$+TEMP3$)
  494.    X=X/2
  495.    Text X,38,TEMP1$+TEMP2$+TEMP3$
  496. End Proc
  497. 'You can test the new keys with this procedure!!!  
  498. Procedure TEST_KEYBOARD
  499.    Shared HIGHLIGHTED_KEY
  500.    Menu Off 
  501.    Ink 6
  502.    Bar X Screen(1,130),Y Screen(1,79) To X Screen(1,446),Y Screen(1,91)
  503.    CUSTOM_INPUT[77,1,4,0,0,6,1,255,True]
  504.    Bar X Screen(1,130),Y Screen(1,79) To X Screen(1,446),Y Screen(1,91)
  505.    If HIGHLIGHTED_KEY<>-1
  506.       DISPLAY_KEY_INFO[HIGHLIGHTED_KEY]
  507.    End If 
  508.    Menu On 
  509. End Proc
  510. 'This procedure is for customised input. 
  511. 'INPSIZE- the size of the input string (no more than screen length!!)  
  512. 'X,Y- the x,y position of the text 
  513. 'TCOL- colour register of text   
  514. 'CURSCOL- colour register of cursor  
  515. 'PAPCOL- colour register of paper  
  516. 'SKEY,EKEY- ASCII values of legal input keys (start to end)  
  517. 'RID- if true erases the string from screen when input 
  518. Procedure CUSTOM_INPUT[INPSIZE,X,Y,TCOL,CURSCOL,PAPCOL,SKEY,EKEY,RID]
  519.    INP$=""
  520.    COUNT=0
  521.    SCANPRESS=0
  522.    X2=X
  523.    Paper PAPCOL
  524.    Print At(X,Y);Space$(INPSIZE+1);
  525.    '   Print At(X-2,Y);"[";At(X+INPSIZE+1,Y);"]"
  526.    Clear Key 
  527.    Repeat 
  528.       Locate X2,Y
  529.       Pen CURSCOL : Print "_" : Pen TCOL
  530.       Locate X2,Y
  531.       Repeat 
  532.          KEY_GET
  533.          PRESSKEY$=Param$
  534.          SCANPRESS=Scancode
  535.       Until(Asc(PRESSKEY$)>=SKEY and Asc(PRESSKEY$)<=EKEY) or SCANPRESS=65 or SCANPRESS=68
  536.       ' If SCANPRESS<>65 and COUNT>0 and SCANPRESS<>68 Then PRESSKEY$=Lower$(PRESSKEY$)
  537.       If SCANPRESS<>65 and COUNT<INPSIZE and SCANPRESS<>68
  538.          Print PRESSKEY$
  539.          INP$=INP$+PRESSKEY$
  540.          Inc COUNT
  541.          Inc X2
  542.       End If 
  543.       If SCANPRESS=65 and X2>X and SCANPRESS<>68
  544.          Dec COUNT
  545.          Dec X2
  546.          Locate X2,Y
  547.          Print "  ";
  548.          INP$=Left$(INP$,COUNT)
  549.       End If 
  550.    Until SCANPRESS=68
  551.    Print At(X2,Y);" "
  552.    Clear Key 
  553.    If RID
  554.       Print At(X,Y);Space$(INPSIZE+2);
  555.    End If 
  556. End Proc[INP$]
  557. 'This procedure just waits for a key and passes its value back to the
  558. 'custom input procedure. 
  559. Procedure KEY_GET
  560.    Repeat 
  561.       PRESSKEY$=Inkey$
  562.    Until PRESSKEY$<>""
  563. End Proc[PRESSKEY$]
  564. 'Aaron Fothergill's (slightly altered to work in hires) Alert Box
  565. '(Uses ZONE's 11+ and returns the button number as a PARAM)  
  566. Procedure ALERT[W,H,BACK_COL,LINE_COL,NB,NL]
  567.    Shared LINE$(),BUTTON$()
  568.    Menu Off 
  569.    TEMP=0
  570.    W=W*8
  571.    H=H*8
  572.    X=(Screen Width/2)-W/2
  573.    Y=4
  574.    Get Block 241,0,Y-2,Screen Width,H+6
  575.    Ink BACK_COL
  576.    Bar X,Y-2 To X+W,Y+H
  577.    Ink LINE_COL
  578.    Box X+1,Y-2 To X+W-1,Y+H-1
  579.    S=W/8/(NB+1)+1
  580.    Paper BACK_COL
  581.    Pen LINE_COL
  582.    For LOP=0 To NL
  583.       Locate 0,Y Text(Y)+1+LOP
  584.       Centre LINE$(LOP)
  585.    Next LOP
  586.    TEMP=0
  587.    While TEMP<>NB
  588.       Locate X Text(X)+S/2+S*TEMP,Y Text(Y+H)-2
  589.       Print Border$(Zone$(BUTTON$(TEMP),TEMP+97),2);
  590.       Inc TEMP
  591.    Wend 
  592.    TEMP=0
  593.    Repeat 
  594.       Repeat : Until Mouse Click and Mouse Key=1
  595.       TEMP=Mouse Zone
  596.    Until TEMP>96
  597.    Put Block 241,0,Y-2
  598.    Del Block 241
  599.    Add TEMP,-96
  600.    For LOP=0 To NB
  601.       BUTTON$(LOP)=""
  602.    Next LOP
  603.    For LOP=0 To NL
  604.       LINE$(LOP)=""
  605.    Next LOP
  606.    Menu On 
  607. End Proc[TEMP]